export class MergeUtil {
  /**
   * 深度合并对象
   * @param target 目标对象
   * @param source 源对象
   */
  public static deepMerge<T = any>(target: T | T[], source: T | T[]): T | T[] {
    // 如果source不是对象或为null，直接返回source
    if (source === null || typeof source !== 'object') {
      return source;
    }

    // 如果target不是对象或为null，创建一个新对象
    if (target === null || typeof target !== 'object') {
      target = Array.isArray(source) ? [] as T[] : {} as T;
    }

    // 遍历source对象的所有属性
    for (const key in source) {
      if (Object.prototype.hasOwnProperty.call(source, key)) {
        // 如果source[key]是对象且不为null，则递归合并
        // @ts-ignore
        if (source[key] !== null && typeof source[key] === 'object') {
          // @ts-ignore
          target[key] = this.deepMerge(target[key] || {}, source[key]);
          // @ts-ignore
        } else if (source[key] !== undefined) {
          // 只合并非undefined的值
          // @ts-ignore
          target[key] = source[key];
        }
      }
    }

    return target;
  }
}
